<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>将原生事件绑定到组件上-没有在根组件上触发，可能在更深的层次</title>
    <script src="../public/vue2.7.14-dev.js"></script>
</head>
<body>
    <!-- 
        在有的时候用.native是很有用的，不过在你尝试监听一个类似 <input> 的非常特定的元素时，这并不是个好主意。
        比如上述 <base-input> 组件可能做了如下重构，所以根元素实际上是一个 <label> 元素：
        
    这时，父级的 .native 监听器将静默失败。它不会产生任何报错，但是 onFocus 处理函数不会如你预期地被调用。
    为了解决这个问题，Vue 提供了一个 $listeners property，它是一个对象，里面包含了作用在这个组件上的所有监听器。例如：

{
  focus: function (event) { /* ... */ }
  input: function (value) { /* ... */ },
}


有了这个 $listeners property，你就可以配合 v-on="$listeners" 将所有的事件监听器指向这个组件的某个特定的子元素。
对于类似 <input> 的你希望它也可以配合 v-model 工作的组件来说，为这些监听器创建一个类似下述 inputListeners 的计算属性通常是非常有用的：
        -->


    <div id="app">
        <base-input :label="label" v-on:focus="onFocus"></base-input>
    </div>

        <script>
            Vue.component('base-input', {
  inheritAttrs: false,
  props: ['label', 'value'],
  computed: {
    inputListeners: function () {
      var vm = this
      // `Object.assign` 将所有的对象合并为一个新对象
      return Object.assign({},
        // 我们从父级添加所有的监听器
        this.$listeners,
        // 然后我们添加自定义监听器，
        // 或覆写一些监听器的行为
        {
          // 这里确保组件配合 `v-model` 的工作
          input: function (event) {
            vm.$emit('input', event.target.value)
          }
        }
      )
    }
  },
  template: `
    <label>
      {{ label }}
      <input
        v-bind="$attrs"
        v-bind:value="value"
        v-on="inputListeners"
      >
    </label>
  `
})

/* 
现在 <base-input> 组件是一个完全透明的包裹器了，也就是说它可以完全像一个普通的 <input> 元素一样使用了：
所有跟它相同的 attribute 和监听器都可以工作，不必再使用 .native 监听器。
*/


new Vue({
  el: "#app",
  data(){
    return {
        label:'随便输入：'
    }
  },
  methods: {
    onFocus() {
      console.log("原生focus触发！");
    },
  },
});

        </script>
</body>
</html>